package club.service.impl;

import club.dao.AdoptAnimalMapper;
import club.pojo.AdoptAnimal;
import club.dao.PetMapper;
import club.dao.UserMapper;
import club.pojo.Pet;
import club.pojo.User;
import club.service.AdoptAnimalService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import club.service.UserService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * 宠物领养服务实现类
 * 处理领养申请的业务逻辑，包括分页查询、创建申请、状态更新等
 */
@Service
@Transactional
public class AdoptAnimalServiceImpl implements AdoptAnimalService {

    @Resource
    private AdoptAnimalMapper adoptAnimalMapper;
    // 领养记录数据访问层

    @Resource
    private UserMapper userMapper;
    // 用户数据访问层

    @Resource
    private PetMapper petMapper;
    // 宠物数据访问层

    @Resource
    private UserService userService;
    // 用户服务层

    /**
     * 分页查询领养记录（支持按用户名和状态筛选）
     * @param userName 申请人用户名（模糊匹配）
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @param state 申请状态（可选，0-待审核，1-已通过，2-已拒绝等）
     * @return 分页结果，包含领养记录及关联的用户和宠物信息
     */
    @Override
    public PageInfo<AdoptAnimal> allAdoptAnimal(String userName, Integer pageNum, Integer pageSize, Integer state) {
        // 1. 根据用户名查询匹配的用户列表
        List<User> users = userService.findByName(userName, state);
        List<Integer> userIds = new ArrayList<>();
        for (User user : users) {
            userIds.add(user.getId());
            // 提取用户ID列表
        }

        // 2. 开启分页并构建查询条件
        PageHelper.startPage(pageNum, pageSize);
        EntityWrapper<AdoptAnimal> wrapper = new EntityWrapper<>();
        if (state != null) {
            wrapper.eq("state", state);
            // 添加状态条件
        }
        if (!userIds.isEmpty()) {
            wrapper.in("userId", userIds);
            // 添加用户ID集合条件
        }

        // 3. 查询领养记录
        List<AdoptAnimal> list = adoptAnimalMapper.selectList(wrapper);

        // 4. 关联用户和宠物信息（非数据库字段）
        for (AdoptAnimal a : list) {
            User u = userMapper.selectById(a.getUserId());
            a.setUser(u);
            // 设置关联的用户
            Pet pet = petMapper.selectById(a.getPetId());
            a.setPet(pet);
            // 设置关联的宠物
        }

        return new PageInfo<>(list);
    }

    /**
     * 创建领养申请
     * @param adoptAnimal 领养申请实体
     * @return 插入成功返回1，失败返回0
     */
    @Override
    public Integer create(AdoptAnimal adoptAnimal) {
        return adoptAnimalMapper.insert(adoptAnimal);
        // 插入领养申请记录
    }

    /**
     * 分页查询已通过的领养记录（支持按领养时间筛选）
     * @param adoptTime 领养时间（模糊匹配，格式：yyyy-MM-dd）
     * @param pageNum 页码
     * @param pageSize 每页数量
     * @return 分页结果，包含领养记录及关联的用户和宠物信息
     */
    @Override
    public PageInfo<AdoptAnimal> all(String adoptTime, Integer pageNum, Integer pageSize) {
        // 1. 开启分页并构建查询条件（仅查询状态为1-已通过的记录）
        PageHelper.startPage(pageNum, pageSize);
        EntityWrapper<AdoptAnimal> wrapper = new EntityWrapper<>();
        if (adoptTime != null && !"".equals(adoptTime)) {
            wrapper.like("adoptTime", adoptTime);
            // 添加时间模糊查询条件
        }
        wrapper.eq("state", 1);
        // 仅查询已通过的记录

        // 2. 查询领养记录
        List<AdoptAnimal> list = adoptAnimalMapper.selectList(wrapper);

        // 3. 关联用户和宠物信息
        for (AdoptAnimal a : list) {
            Pet pet = petMapper.selectById(a.getPetId());
            a.setPet(pet);
            User user = userMapper.selectById(a.getUserId());
            a.setUser(user);
        }

        return new PageInfo<>(list);
    }

    /**
     * 更新领养申请状态
     * @param id 申请ID
     * @param state 新状态（0-待审核，1-已通过，2-已拒绝等）
     * @return 更新成功返回1，失败返回0
     */
    @Override
    public int update(Integer id, Integer state) {
        AdoptAnimal adoptAnimal = adoptAnimalMapper.selectById(id);
        if (adoptAnimal != null) {
            adoptAnimal.setState(state);
            // 更新状态
            return adoptAnimalMapper.updateById(adoptAnimal);
            // 执行更新
        }
        return 0;
    }
}